using System;
using System.IO;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;

namespace A4G.Utils.Xml
{
	public class XsltTransformationHelper : IDisposable
	{
		private bool _disposed = false;

		public XsltTransformationHelper(string xsltPath)
		{
			_xsltPath = xsltPath;

			_xsltReader = new XmlTextReader(XsltPath);
			XslTransform.Load(_xsltReader);
		}

		~XsltTransformationHelper()
		{
			Dispose(false);
		}

		private readonly string _xsltPath;
		public string XsltPath
		{
			get
			{
				return _xsltPath;
			}
		}

		private XslCompiledTransform _transform = new XslCompiledTransform();
		private XslCompiledTransform XslTransform
		{
			get
			{
				return _transform;
			}
		}

		private readonly XmlReader _xsltReader;
		private XmlReader XsltReader
		{
			get
			{
				return _xsltReader;
			}
		}

		public byte[] TransformWithXslt(byte[] sourceBytes)
		{
			MemoryStream source = new MemoryStream(sourceBytes, false);
			XmlReader xmlReader = new XmlTextReader(source);
			MemoryStream destination = new MemoryStream();

			byte[] destinationBytes = null;
			try
			{
				XslTransform.Transform(xmlReader, null, destination);
				destinationBytes = destination.ToArray();
			}
			finally
			{
				destination.Close();
				xmlReader.Close();
				source.Close();
			}

			return destinationBytes;
		}

		#region IDisposable Members
		public void Dispose()
		{
			Dispose(true);
			GC.SuppressFinalize(this);
		}

		private void Dispose(bool disposing)
		{
			if (_disposed)
			{
				return;
			}

			if (disposing)
			{
				// clean up managed resources
				XsltReader.Close();
			}

			// clean up unmanaged resources

			_disposed = true;
		}
		#endregion
	}
}
